package love.server.ui;

import java.util.ArrayList;

import love.listener.ILoveGameListener;
import love.model.Joueur;
import love.model.Partie;
import love.server.JSONTCPServer;
import love.ui.images.ImageLoader;

import org.eclipse.jface.viewers.ArrayContentProvider;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.jface.viewers.ListViewer;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Group;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.List;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Text;

public class AdminUI extends Shell implements ILoveGameListener {
	private PlayerComposite groupJoueur1;
	private PlayerComposite groupJoueur4;
	private PlayerComposite groupJoueur3;
	private PlayerComposite groupJoueur2;
	
	ArrayList<PlayerComposite> groupesJoueurs = new ArrayList<PlayerComposite>();
	private ListViewer listPartiesViewer;
	
	private JSONTCPServer server;
	
	private Partie selectedPartie;
	private Composite composite_1;
	private Label lblPort;
	private Label labelServerPort;
	private Text textPioche;

	public AdminUI(Display display) {
		super(display, SWT.SHELL_TRIM);
		ImageLoader.initImageRegistry(display);
		
		server = new JSONTCPServer();
		
		server.addLoveLetterListener(this);
		
		setLayout(new GridLayout(2, false));
		
		Group grpParties = new Group(this, SWT.NONE);
		grpParties.setLayout(new GridLayout(1, false));
		GridData gd_grpParties = new GridData(SWT.FILL, SWT.FILL, false, true, 1, 1);
		gd_grpParties.widthHint = 258;
		grpParties.setLayoutData(gd_grpParties);
		grpParties.setText("Parties");
		
		composite_1 = new Composite(grpParties, SWT.NONE);
		composite_1.setLayout(new GridLayout(2, false));
		composite_1.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false, 1, 1));
		
		lblPort = new Label(composite_1, SWT.NONE);
		lblPort.setText("Port: ");
		
		labelServerPort = new Label(composite_1, SWT.NONE);
		labelServerPort.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1));
		
		listPartiesViewer = new ListViewer(grpParties, SWT.BORDER | SWT.V_SCROLL);
		List list = listPartiesViewer.getList();
		list.addSelectionListener(new SelectionAdapter() {
			@Override
			public void widgetSelected(SelectionEvent e) {
				updateUI();
			}
		});
		list.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1));
		
		Group grpEtat = new Group(this, SWT.NONE);
		grpEtat.setLayout(new GridLayout(3, false));
		grpEtat.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1));
		grpEtat.setText("Etat");
		
		textPioche = new Text(grpEtat, SWT.BORDER | SWT.READ_ONLY | SWT.WRAP | SWT.CENTER | SWT.MULTI);
		textPioche.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1));
		
		groupJoueur1 = new PlayerComposite(grpEtat, SWT.NONE);
		groupJoueur1.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1));
		new Label(grpEtat, SWT.NONE);
		
		groupJoueur4 = new PlayerComposite(grpEtat, SWT.NONE);
		groupJoueur4.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1));
		new Label(grpEtat, SWT.NONE);
		
		
		
		groupJoueur2 = new PlayerComposite(grpEtat, SWT.NONE);
		groupJoueur2.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1));
		new Label(grpEtat, SWT.NONE);
		
		groupJoueur3 = new PlayerComposite(grpEtat, SWT.NONE);
		groupJoueur3.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1));
		
		createContents();
		
		listPartiesViewer.setContentProvider(new ArrayContentProvider());
		listPartiesViewer.setLabelProvider(new LabelProvider(){
			@Override
			public String getText(Object element) {
				if (element instanceof Partie) {
					Partie partie = (Partie) element;
					return partie.getNomPartie()+" => "+partie.getEtat();
					
				}
				return "-";
			}
		});
		listPartiesViewer.setInput(server.getParties());
		
		groupesJoueurs.add(groupJoueur1);
		groupesJoueurs.add(groupJoueur2);
		groupesJoueurs.add(groupJoueur3);
		groupesJoueurs.add(groupJoueur4);
		new Label(grpEtat, SWT.NONE);
	}

	/**
	 * Create contents of the shell.
	 */
	protected void createContents() {
		setText("Serveur de bisoux");
		setSize(1280, 800);

	}
	
	public Partie getSelectedPartie(){
		Display.getDefault().syncExec(new Runnable() {
			public void run() {
		    	if(listPartiesViewer.getSelection().isEmpty())
		    		selectedPartie = null;
		    	else{
		    		selectedPartie = (Partie)((StructuredSelection)listPartiesViewer.getSelection()).getFirstElement();
		    	}
		    }
		});
		return selectedPartie;
	}
	
	public void updateUI(){
		Display.getDefault().syncExec(new Runnable() {
			public void run() {
		    	Partie partie = getSelectedPartie();
		    	if(partie != null){
		    		for(int i=0; i<partie.getJoueurs().size(); i++){
		    			groupesJoueurs.get(i).setJoueur(partie.getJoueurs().get(i));
		    			groupesJoueurs.get(i).update();
		    		}
		    	}
		    	listPartiesViewer.refresh();
		    	if(!server.getParties().isEmpty() && getSelectedPartie() == null){
		    		listPartiesViewer.setSelection(new StructuredSelection(server.getParties().get(0)));
		    	}
		    	labelServerPort.setText(""+JSONTCPServer.PORT_ACTIONS);
		    	
		    	//Pioche
		    	String textPioche = "";
		    	if(partie != null){
		    		for(int i=partie.getPioche().size()-1; i>=0; i--){
		    			textPioche += partie.getPioche().get(i).getNom()+"\n";
		    		}
		    		AdminUI.this.textPioche.setText(textPioche.trim());
		    	}
		    	
		    	for(PlayerComposite composite: groupesJoueurs){
		    		composite.update();
		    	}
		    }
		});
		
	}
	
	@Override
	protected void checkSubclass() {
		// Disable the check that prevents subclassing of SWT components
	}

	@Override
	public void tick(Partie partie) throws Exception {
		updateUI();
	}

	@Override
	public void notifyNextPlayerToDoAction(Partie partie) throws Exception {
		Joueur nextPlayer = partie.getNextPlayer();
		for(final PlayerComposite composite: groupesJoueurs){
			composite.setPlaying(nextPlayer == null? false: nextPlayer.equals(composite.getJoueur()));
			getDisplay().syncExec(new Runnable() {
				@Override
				public void run() {
					composite.update();
				}
			});
		}
	}

	@Override
	public void notifyRoundOver(Partie partie, java.util.List<Joueur> gagnant) throws Exception {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void notifyGameOver(Partie partie, Joueur gagnant) throws Exception {
		// TODO Auto-generated method stub
		
	}

	public JSONTCPServer getServer() {
		return server;
	}

	public void setServer(JSONTCPServer server) {
		this.server = server;
	}
	
	
}
